package ml.kupin.controller;

import ml.kupin.common.constant.KuPinConstant;
import ml.kupin.common.utils.FileDownUtils;
import ml.kupin.common.utils.KuPinResult;
import ml.kupin.common.vo.EasyUIDataGridResult;
import ml.kupin.pojo.TbItem;
import ml.kupin.service.ItemCategoryService;
import ml.kupin.service.ItemService;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.MimeTypeUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by 小柯(Allen Kerr) on 17.4.24 14:52.
 */
@Controller
@RequestMapping("/item")
public class ItemController {
    @Autowired
    private ItemService itemService;
    @Autowired
    private ItemCategoryService itemCategoryService;

    /**
     * 测试 zookeeper + dubbo 是否配置成功
     *
     * @param id
     * @return
     */
    @RequestMapping("/{id}")
    @ResponseBody
    public TbItem getItemById(@PathVariable Long id) {
        TbItem item = itemService.getItemById(id);
        return item;
    }

    /**
     * 分页查询商品信息
     * http://localhost:8081/item/list?page=1&rows=30
     */
    @RequestMapping("/list")
    @ResponseBody
    public EasyUIDataGridResult<TbItem> getItemsByPage(int page, int rows) {
        EasyUIDataGridResult<TbItem> items = itemService.getItems(page, rows);
        return items;
    }

    /**
     * 添加商品
     * 页面传递过来的数据：
     * 商品表；cid title sellPoint priceView price num barcode image
     * 商品描述表：desc
     * 未知：itemParams 商品规格
     */
    @RequestMapping(value = "/save", method = RequestMethod.POST)//限定请求方式
    @ResponseBody
    public KuPinResult addItem(TbItem item, String desc) {
        KuPinResult kuPinResult = null;
        try {
            //调用service层添加商品
            kuPinResult = itemService.addItem(item, desc);
        } catch (Exception e) {
            e.printStackTrace();
            return kuPinResult.notOk("添加失败！");
        }
        //返回结果
        return kuPinResult;
    }

    /**
     * 商品上架
     *
     * @param id
     * @return
     * @throws Exception
     */
    @RequestMapping("/reshelf")
    @ResponseBody
    public KuPinResult reshelf(@RequestParam("ids") long id) {
        //状态
        byte status = KuPinConstant.Item_Normal;
        KuPinResult kuPinResult = null;
        try {
            //执行更新
            kuPinResult = itemService.updateStatus(id, status);
        } catch (Exception e) {
            e.printStackTrace();
            return KuPinResult.notOk("下架失败！");
        }
        //更新成功
        return kuPinResult;
    }


    /**
     * 商品下架
     *
     * @param id
     * @return
     * @throws Exception
     */
    @RequestMapping("/instock")
    @ResponseBody
    public KuPinResult instock(@RequestParam("ids") long id) {
        //状态
        byte status = KuPinConstant.Item_Not_Sale;
        KuPinResult kuPinResult = null;
        try {
            //执行更新
            kuPinResult = itemService.updateStatus(id, status);
        } catch (Exception e) {
            e.printStackTrace();
            return KuPinResult.notOk("上架失败！");
        }
        //更新成功
        return kuPinResult;
    }

    /**
     * 商品删除
     *
     * @param id
     * @return
     * @throws Exception
     */
    @RequestMapping("/delete")
    @ResponseBody
    public KuPinResult delete(@RequestParam("ids") long id) {
        //状态
        byte status = KuPinConstant.Item_Deleted;
        KuPinResult kuPinResult = null;
        try {
            //执行更新
            kuPinResult = itemService.updateStatus(id, status);
        } catch (Exception e) {
            e.printStackTrace();
            return KuPinResult.notOk("删除失败！");
        }
        //更新成功
        return kuPinResult;
    }

    /**
     * 查询商品描述，回显到商品编辑页面上去
     *
     * @param itemId
     * @return
     */
    @RequestMapping(value = "/queryItemDesc/{itemId}", method = RequestMethod.GET)
    @ResponseBody
    public KuPinResult queryItemDesc(@PathVariable long itemId) {
        //查询
        KuPinResult result = itemService.findItemDesc(itemId);
        //返回
        return result;
    }

    /**
     * 修改商品
     * 页面传递过来的数据：
     * 商品表；id cid title sellPoint priceView price num barcode image
     * 商品描述表：desc
     * 商品规格表：itemParamId itemParams
     */
    @RequestMapping(value = "/update", method = RequestMethod.POST)//限定请求方式
    @ResponseBody
    public KuPinResult updateItem(TbItem item, String desc) {
        KuPinResult kuPinResult = null;
        try {
            //调用service层修改商品
            kuPinResult = itemService.updateItem(item, desc);
        } catch (Exception e) {
            e.printStackTrace();
            return kuPinResult.notOk("修改失败！");
        }
        //返回结果
        return kuPinResult;
    }

    /**
     * 导出所有商品数据到Excel表格中，并提供下载
     */
    @RequestMapping(value = "/export", method = RequestMethod.GET)
    public void exportItems2Excel(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //商品状态：1-正常，2-下架，3-删除
        Map<Byte, String> itemStatusMap = new HashMap<>();
        itemStatusMap.put(KuPinConstant.Item_Normal, "正常");
        itemStatusMap.put(KuPinConstant.Item_Not_Sale, "下架");
        itemStatusMap.put(KuPinConstant.Item_Deleted, "删除");

        //商品类目编号与名称的对应关系
//        Date start = new Date();
        Map<String, String> categoriesMap = itemCategoryService.getItemCategoriesMap();
//        Date end = new Date();
//        System.out.println(end.getTime() - start.getTime());
        /**
         * key需要从String转换为Long，时间统计
         * 无缓存：1417
         * 有缓存：第一次64，第二次44
         * key无需转换，时间统计
         * 无缓存：737
         * 有缓存：第一次16、第二次13
         */

        List<TbItem> itemList = itemService.findAll();
        //在内存中创建一个Excel文件
        HSSFWorkbook workbook = new HSSFWorkbook();
        //创建一个标签页
        HSSFSheet sheet = workbook.createSheet("商品数据");
        //创建标题行
        HSSFRow headRow = sheet.createRow(0);
        headRow.createCell(0).setCellValue("商品编号");
        headRow.createCell(1).setCellValue("商品标题");
        headRow.createCell(2).setCellValue("商品卖点");
        headRow.createCell(3).setCellValue("商品价格");
        headRow.createCell(4).setCellValue("库存数量");
        headRow.createCell(5).setCellValue("条形码");
//        headRow.createCell(0).setCellValue("商品图片");
        headRow.createCell(6).setCellValue("所属类目编号");
        headRow.createCell(7).setCellValue("所属类目名称");
        headRow.createCell(8).setCellValue("商品状态");
        headRow.createCell(9).setCellValue("创建时间");
        headRow.createCell(10).setCellValue("更新时间");
        //遍历集合，添加到sheet中去
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for (TbItem item : itemList) {
            HSSFRow row = sheet.createRow(sheet.getLastRowNum() + 1);
            row.createCell(0).setCellValue(item.getId());   //商品编号
            row.createCell(1).setCellValue(item.getTitle());   //商品标题
            row.createCell(2).setCellValue(item.getSellPoint());   //商品卖点
            row.createCell(3).setCellValue(item.getPrice() * 1.0 / 100 + "元");   //商品价格
            row.createCell(4).setCellValue(item.getNum());   //库存数量
            row.createCell(5).setCellValue(item.getBarcode());   //条形码
            row.createCell(6).setCellValue(item.getCid());   //所属类目编号
            row.createCell(7).setCellValue(categoriesMap.get(item.getCid().toString()));   //所属类目名称
            row.createCell(8).setCellValue(itemStatusMap.get(item.getStatus()));   //商品状态
            row.createCell(9).setCellValue(dateFormat.format(item.getCreated()));   //创建时间
            row.createCell(10).setCellValue(dateFormat.format(item.getUpdated()));  //更新时间
        }

        //使用输出流进行文件下载（一个流、两个头）
        //设置下载时客户端Excel的名称
        String filename = "商品数据" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".xls";
        //获取客户端浏览器类型
        /**
         * debug获得以下数据：
         * Chrome: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36
         * Firefox: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0
         * MS Edge: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063
         */
        String agent = request.getHeader("User-Agent");
        //设置文件名编码，解决乱码问题
        filename = FileDownUtils.encodeDownloadFilename(filename, agent);
        //两个头
        //contentType
        //如果知道文件类型，就声明文件类型：
//        response.setContentType("application/vnd.ms-excel");
        //如果不知道就设置成自动识别，不过不能保证对所有格式的文件都能正确识别：
        response.setContentType(MimeTypeUtils.MULTIPART_FORM_DATA_VALUE);//"multipart/form-data"
        //header
        response.setHeader("Content-disposition", "attachment;filename=" + filename);
        //一个流
        ServletOutputStream os = response.getOutputStream();
        workbook.write(os);
        os.flush();
        os.close();
    }

}
